# CMake 脚本：检查已安装版本并在需要时卸载
# 此脚本在安装前执行，检查已安装的版本，如果新版本更高则自动卸载旧版本
# 注意：此文件通过 configure_file 生成，@PROJECT_VERSION@ 和 @CMAKE_INSTALL_PREFIX@ 会被替换

# 获取安装前缀（install(SCRIPT) 执行时，CMAKE_INSTALL_PREFIX 会自动设置）
if(DEFINED CMAKE_INSTALL_PREFIX)
    set(INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}")
else()
    # 如果未定义，使用配置时的值
    set(INSTALL_PREFIX "@CMAKE_INSTALL_PREFIX@")
    if(INSTALL_PREFIX STREQUAL "")
        set(INSTALL_PREFIX "/usr/local")
    endif()
endif()

# 检查版本文件路径
set(INSTALLED_VERSION_FILE "${INSTALL_PREFIX}/lib/cmake/tools/toolsConfigVersion.cmake")
set(INSTALL_MANIFEST "${INSTALL_PREFIX}/lib/cmake/tools/install_manifest.txt")

# 检查是否存在已安装的版本
if(EXISTS "${INSTALLED_VERSION_FILE}")
    message(STATUS "检测到已安装的 tools 库，正在检查版本...")
    
    # 读取已安装的版本文件
    file(READ "${INSTALLED_VERSION_FILE}" VERSION_FILE_CONTENT)
    
    # 提取版本号（格式：set(PACKAGE_VERSION "0.2.4")）
    string(REGEX MATCH "set\\(PACKAGE_VERSION \"([0-9]+\\.[0-9]+\\.[0-9]+)\"\\)" _ "${VERSION_FILE_CONTENT}")
    if(CMAKE_MATCH_1)
        set(INSTALLED_VERSION "${CMAKE_MATCH_1}")
        message(STATUS "已安装版本: ${INSTALLED_VERSION}")
        message(STATUS "当前版本: @PROJECT_VERSION@")
        
        # 比较版本号
        if("@PROJECT_VERSION@" VERSION_LESS INSTALLED_VERSION)
            # 当前版本严格小于已安装版本，显示警告
            message(WARNING "当前版本 @PROJECT_VERSION@ 低于已安装版本 ${INSTALLED_VERSION}")
            message(WARNING "如果继续安装，可能会覆盖较新的版本。")
            message(WARNING "建议先手动卸载旧版本，或升级到更新的版本。")
        else()
            # 当前版本 >= 已安装版本（包括等于的情况），允许安装
            if("@PROJECT_VERSION@" VERSION_EQUAL INSTALLED_VERSION)
                message(STATUS "当前版本 @PROJECT_VERSION@ 等于已安装版本 ${INSTALLED_VERSION}，将覆盖安装...")
            else()
                message(STATUS "新版本 @PROJECT_VERSION@ > 已安装版本 ${INSTALLED_VERSION}，将卸载旧版本...")
            endif()
            
            # 尝试使用 install_manifest.txt 卸载
            if(EXISTS "${INSTALL_MANIFEST}")
                message(STATUS "使用 install_manifest.txt 卸载...")
                file(READ "${INSTALL_MANIFEST}" MANIFEST_CONTENT)
                string(REPLACE "\n" ";" MANIFEST_FILES "${MANIFEST_CONTENT}")
                foreach(FILE ${MANIFEST_FILES})
                    string(STRIP "${FILE}" FILE)
                    if(FILE AND EXISTS "${FILE}")
                        message(STATUS "删除: ${FILE}")
                        file(REMOVE "${FILE}")
                    endif()
                endforeach()
                # 删除 manifest 文件本身
                if(EXISTS "${INSTALL_MANIFEST}")
                    file(REMOVE "${INSTALL_MANIFEST}")
                endif()
            else()
                # 如果没有 manifest，手动删除已知的安装文件
                message(STATUS "未找到 install_manifest.txt，手动删除安装文件...")
                
                # 删除库文件
                if(EXISTS "${INSTALL_PREFIX}/lib/libtools.a")
                    file(REMOVE "${INSTALL_PREFIX}/lib/libtools.a")
                endif()
                
                # 删除头文件目录
                if(EXISTS "${INSTALL_PREFIX}/include/tools")
                    file(REMOVE_RECURSE "${INSTALL_PREFIX}/include/tools")
                endif()
                
                # 删除 CMake 配置文件
                if(EXISTS "${INSTALL_PREFIX}/lib/cmake/tools")
                    file(REMOVE_RECURSE "${INSTALL_PREFIX}/lib/cmake/tools")
                endif()
            endif()
            
            message(STATUS "旧版本已卸载，准备安装新版本...")
        endif()
    else()
        message(WARNING "无法从版本文件中提取版本号，跳过版本检查")
    endif()
else()
    message(STATUS "未检测到已安装的 tools 库，将进行全新安装...")
endif()

